#ifndef LINEFINDER_H
#define LINEFINDER_H

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>

class LineFinder {

  private:

      // imagem original
      cv::Mat img;

      // vetor contendo pontos finais das linhas detectadas
      std::vector<cv::Vec4i> lines;

      // parametros de resolucao da funcao hough
      double deltaRho;
      double deltaTheta;

      int minVote;

      // tamanho minimo da linha
      double minLength;

      // maximo intervalo considerado em uma linha
      double maxGap;

  public:

      LineFinder() : deltaRho(1), deltaTheta(CV_PI/180), minVote(10), minLength(0.), maxGap(0.) {}

      // configura a resolucao do acumulador
      void setAccResolution(double dRho, double dTheta) {

          deltaRho= dRho;
          deltaTheta= dTheta;
      }

      // configura o minimo de votes
      void setMinVote(int minv) {

          minVote= minv;
      }

      // configura o tamanho da linha e lacuna
      void setLineLengthAndGap(double length, double gap) {

          minLength= length;
          maxGap= gap;
      }

      // probabilistic Hough Transform
      std::vector<cv::Vec4i> findLines(cv::Mat& binary) {

          lines.clear();
          cv::HoughLinesP(binary,lines,deltaRho,deltaTheta,minVote, minLength, maxGap);

          return lines;
      }

      // Imprime as linhas detectadas
      void drawDetectedLines(cv::Mat &image, cv::Scalar color=cv::Scalar(255,255,255)) {

          std::vector<cv::Vec4i>::const_iterator it2= lines.begin();

          while (it2!=lines.end()) {

              cv::Point pt1((*it2)[0],(*it2)[1]);
              cv::Point pt2((*it2)[2],(*it2)[3]);

              cv::line( image, pt1, pt2, color);

              ++it2;
          }
      }

};

#endif // LINEFINDER_H
